Add a new hash class in __gnu_ext for the extension containers. There are two motivations for this. First, this allows users who are specializing __gnu_ext::hash to continue doing so without changing their code. Second, SGI specifies hash overloads for char* and const char* that perform a hash of the string, not of the pointer. In order to support this, the hashing code for string is factored out. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@136539 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/string b/include/string index d1b9a5e..8d48e0a 100644 --- a/include/string +++ b/include/string 
@@ -3857,6 +3857,21 @@  const typename basic_string<_CharT, _Traits, _Allocator>::size_type  basic_string<_CharT, _Traits, _Allocator>::npos;   +template<class _Ptr> +size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e) +{ + size_t __r = 0; + const size_t __sr = __CHAR_BIT__ * sizeof(size_t) - 8; + const size_t __m = size_t(0xF) << (__sr + 4); + for (; __p != __e; ++__p) + { + __r = (__r << 4) + *__p; + size_t __g = __r & __m; + __r ^= __g | (__g >> __sr); + } + return __r; +} +  template<class _CharT, class _Traits, class _Allocator>  struct _LIBCPP_VISIBLE hash<basic_string<_CharT, _Traits, _Allocator> >  : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t> @@ -3870,20 +3885,7 @@  hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(  const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT  { - typedef basic_string<_CharT, _Traits, _Allocator> S; - typedef typename S::const_pointer const_pointer; - size_t __r = 0; - const size_t __sr = __CHAR_BIT__ * sizeof(size_t) - 8; - const size_t __m = size_t(0xF) << (__sr + 4); - const_pointer __p = __val.data(); - const_pointer __e = __p + __val.size(); - for (; __p != __e; ++__p) - { - __r = (__r << 4) + *__p; - size_t __g = __r & __m; - __r ^= __g | (__g >> __sr); - } - return __r; + return __do_string_hash(__val.data(), __val.data() + __val.size());  }    template<class _CharT, class _Traits, class _Allocator>